Add an expand button box type
authorWilliam Jon McCann <william.jon.mccann@gmail.com>
Sun, 12 Jan 2014 01:27:42 +0000 (20:27 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 17 Jan 2014 22:52:07 +0000 (17:52 -0500)
https://bugzilla.gnome.org/show_bug.cgi?id=720059

gtk/gtkbbox.c
gtk/gtkenums.h
tests/testbbox.c

index 22ca734d8faa8dd9d04df5bc4042db456a3802f6..becdca2fbacd785bef1aca018a33617f9be046a3 100644 (file)
@@ -349,6 +349,10 @@ gtk_button_box_set_layout (GtkButtonBox      *widget,
   if (priv->layout_style != layout_style)
     {
       priv->layout_style = layout_style;
+      if (priv->layout_style == GTK_BUTTONBOX_EXPAND)
+        gtk_box_set_homogeneous (GTK_BOX (widget), TRUE);
+      else
+        gtk_box_set_homogeneous (GTK_BOX (widget), FALSE);
       g_object_notify (G_OBJECT (widget), "layout-style");
       gtk_widget_queue_resize (GTK_WIDGET (widget));
     }
@@ -416,15 +420,25 @@ gtk_button_box_set_child_secondary (GtkButtonBox *widget,
                                     GtkWidget    *child,
                                     gboolean      is_secondary)
 {
+  GtkButtonBox *bbox;
+
   g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
   g_return_if_fail (GTK_IS_WIDGET (child));
   g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (widget));
 
+  bbox = GTK_BUTTON_BOX (widget);
+
   g_object_set_data (G_OBJECT (child),
                      GTK_BOX_SECONDARY_CHILD,
                      is_secondary ? GINT_TO_POINTER (1) : NULL);
   gtk_widget_child_notify (child, "secondary");
 
+  if (bbox->priv->layout_style == GTK_BUTTONBOX_EXPAND)
+    {
+      gtk_box_set_child_packing (GTK_BOX (bbox), child, TRUE, TRUE, 0,
+                                 is_secondary ? GTK_PACK_START : GTK_PACK_END);
+    }
+
   if (gtk_widget_get_visible (GTK_WIDGET (widget)) &&
       gtk_widget_get_visible (child))
     gtk_widget_queue_resize (child);
@@ -714,6 +728,7 @@ gtk_button_box_size_request (GtkWidget      *widget,
           case GTK_BUTTONBOX_START:
           case GTK_BUTTONBOX_END:
           case GTK_BUTTONBOX_CENTER:
+          case GTK_BUTTONBOX_EXPAND:
             if (orientation == GTK_ORIENTATION_HORIZONTAL)
               requisition->width = total_size + ((nvis_children - 1)*spacing);
             else
@@ -827,6 +842,13 @@ gtk_button_box_size_allocate (GtkWidget     *widget,
   bbox = GTK_BUTTON_BOX (widget);
   priv = bbox->priv;
 
+  if (priv->layout_style == GTK_BUTTONBOX_EXPAND)
+    {
+      GTK_WIDGET_CLASS (gtk_button_box_parent_class)->size_allocate (widget, allocation);
+      return;
+    }
+
+
   orientation = gtk_orientable_get_orientation (GTK_ORIENTABLE (widget));
   spacing = gtk_box_get_spacing (GTK_BOX (widget));
 
index e87c983fc942be0390f2d778f8b491e33c6368d7..dbd74bebdb0a1d0352ec1aeef21c47c270625fa1 100644 (file)
@@ -162,6 +162,7 @@ typedef enum
  * @GTK_BUTTONBOX_END: Buttons are grouped towards the end of the box,
  *   (on the right for a HBox, or the bottom for a VBox).
  * @GTK_BUTTONBOX_CENTER: Buttons are centered in the box. Since 2.12.
+ * @GTK_BUTTONBOX_EXPAND: Buttons expand to fill the box. Since 3.12.
  *
  * Used to dictate the style that a #GtkButtonBox uses to layout the buttons it
  * contains. (See also: #GtkVButtonBox and #GtkHButtonBox).
@@ -172,7 +173,8 @@ typedef enum
   GTK_BUTTONBOX_EDGE,
   GTK_BUTTONBOX_START,
   GTK_BUTTONBOX_END,
-  GTK_BUTTONBOX_CENTER
+  GTK_BUTTONBOX_CENTER,
+  GTK_BUTTONBOX_EXPAND
 } GtkButtonBoxStyle;
 
 
index 952684906accc63a2120ecb496f5b45c1d8d4557..8f2444db479ff0e1b87efb05592a2bd190b540d0 100644 (file)
@@ -28,6 +28,7 @@ static const char* styles[] = { "GTK_BUTTONBOX_SPREAD",
                                "GTK_BUTTONBOX_START",
                                "GTK_BUTTONBOX_END",
                                "GTK_BUTTONBOX_CENTER",
+                               "GTK_BUTTONBOX_EXPAND",
                                NULL};
 
 static const char* types[] = { "GtkHButtonBox",